import java.util.*;
import java.math.*;

public class Test {
    public static void myShuffle(List<Integer> L) {
        Set<Integer> randomIndexSet = new LinkedHashSet<>();    // 用于存放随机数索引
        List<Integer> tempList = new ArrayList<>(L);     // 复制L作为tempList
        Random random = new Random();
        int lSize = L.size();   // 记录L的初始容量

        // 这里循环不能使用L.size了，因为循环中有调用remove函数，L.size在循环中会发生变化
        while (randomIndexSet.size() < lSize) {
            int ind = random.nextInt(lSize);    // 生成随机索引
            if (randomIndexSet.contains(ind)) continue; // 如果set中含有这个索引，则continue，不往下执行，直接进入下一次循环

            // 程序能够运行到这里说明上面的if条件不成立，即set中不包含当前随机生成的索引
            randomIndexSet.add(ind);    // 将这个随机索引放入set以维持唯一性
            tempList.set(ind, L.remove(0)); // 移除L首元素，设置到tempList的随机索引位置
        }

        // 使用addAll，将tempList里所有元素都加入到L
        L.addAll(tempList);
    }

    public static void main(String[] args) {
        List<Integer> l = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            l.add(i);   //顺序生成10个数
        }

        myShuffle(l);   //调用shuffle

        //输出
        for (int num : l) {
            System.out.println(num);
        }
    }
}